package br.com.gr.jcash.bo;

import br.com.gr.jcash.dao.MovimentoDAO;
import br.com.gr.jcash.dmp.Conta;
import br.com.gr.jcash.dmp.Movimento;
import br.com.gr.jcash.dmp.TipoCategoria;
import br.com.gr.jcash.dmp.Usuario;
import br.com.gr.jcash.exception.JCashException;
import br.com.gr.jcash.iface.IMovimentoBO;
import br.com.gr.jcash.iface.IUsuarioBO;
import br.com.gr.jcash.utils.Filtro;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.EJBContext;
import javax.ejb.Local;
import javax.ejb.Stateless;

@Stateless(mappedName = "ejb/MovimentoBO")
@Local(IMovimentoBO.class)
public class MovimentoBO implements IMovimentoBO {

    @EJB
    private MovimentoDAO dao;
    @EJB
    private IUsuarioBO usuarioBO;
    @Resource
    private EJBContext context;

    public MovimentoBO() {
    }

    @Override
    public void criar(Movimento entidade) throws JCashException {
        entidade.setUsuario(getUsuario());
        Conta origem = entidade.getCtaOrigem();
        Conta destino = entidade.getCtaDestino();
        if (destino.getCategoria().getCatTipo().equals(TipoCategoria.C)) {
            if (entidade.getMvtData().before(destino.getCtaDataInicial())) {
                throw new JCashException("Lançamento anterior a data de início de conta!" + destino.getCtaDescricao());
            }
        }

        if (origem.getCategoria().getCatTipo().equals(TipoCategoria.C)) {
            if (entidade.getMvtData().before(origem.getCtaDataInicial())) {
                throw new JCashException("Lançamento anterior a data de início de conta: " + origem.getCtaDescricao());
            }
        }
        dao.incluir(entidade);
    }

    @Override
    public Movimento editar(Movimento entidade) throws JCashException {
        return dao.atualizar(entidade);
    }

    @Override
    public void remover(Movimento entidade) throws JCashException {
        dao.remover(entidade);
    }

    @Override
    public Movimento buscarPorId(Long id) throws JCashException {
        return dao.buscarPorId(id);
    }

    @Override
    public List<Movimento> buscarTodos() throws JCashException {
        return dao.buscarTodos(getUsuario());
    }

    @Override
    public Long count() throws JCashException {
        return dao.count(getUsuario());
    }

    @Override
    public List<Movimento> buscarPorFaixa(int[] faixa) throws JCashException {
        return dao.buscarPorFaixa(getUsuario(), faixa);
    }

    private Usuario getUsuario() throws JCashException {
        return usuarioBO.buscarPorLogin(context.getCallerPrincipal().getName());
    }

    @Override
    public List<Movimento> buscarRelatorio(Filtro filtro) throws JCashException {
        return dao.buscarTodosFiltro(getUsuario(),filtro);
    }

    @Override
    public boolean existeMovimentoPorConta(Conta conta) throws JCashException {
        if (dao.countPorConta(getUsuario(), conta) >= 1) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public boolean existeMovimentoPorContaAnteriorData(Conta conta) throws JCashException {
        if (dao.countPorContaDataAnterior(getUsuario(), conta, conta.getCtaDataInicial()) >= 1) {
            return true;
        } else {
            return false;

        }
    }

    @Override
    public List<Movimento> buscarPorContaEntreDatas(Conta conta, Date dataInicial, Date dataFinal) throws JCashException {
        return dao.buscarTodos("Movimento.porContaEntreDatas", getUsuario(), conta, conta, dataInicial, dataFinal);
    }
    
    @Override
    public List<String> buscarHistorico() throws JCashException {
        return dao.getHistorico();
    }
    
}
